/**
 * 
 */
package org.funismycompta.testu;

import java.util.List;

import junit.framework.Assert;

import org.apache.log4j.Logger;
import org.funismycompta.dao.CompteDao;
import org.funismycompta.dao.PersonneDao;
import org.funismycompta.dao.hibernate.CompteDaoImpl;
import org.funismycompta.dao.hibernate.PersonneDaoImpl;
import org.funismycompta.modele.Account;
import org.funismycompta.modele.Personne;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * @author Dim
 * 
 */
public class DaoTestU {

	private static final Logger logger = Logger.getLogger(DaoTestU.class);

	private static CompteDao compteDao = null;

	private static PersonneDao personneDao = null;

	Personne personne1 = null;

	Account compte1 = null;

	@BeforeClass
	public static void init() {
		logger.debug("init");
		compteDao = new CompteDaoImpl();
		personneDao = new PersonneDaoImpl();
	}

	@Test
	public void testCreerPersonne() {
		logger.error("testCreerPersonne");
		personne1 = new Personne();
		personne1.setLogin("login");
		personne1.setMotDePasse("motDePasse");
		personne1.setNom("nom");
		personne1.setPrenom("prenom");

		personneDao.creerPersonne(personne1);

		Personne personne2 = personneDao.getPersonne(1);

		Assert.assertEquals(personne1.getLogin(), personne2.getLogin());
		Assert.assertEquals(personne1.getMotDePasse(), personne2
				.getMotDePasse());
		Assert.assertEquals(personne1.getNom(), personne2.getNom());
		Assert.assertEquals(personne1.getPersonneId(), personne2
				.getPersonneId());
		Assert.assertEquals(personne1.getPrenom(), personne2.getPrenom());
	}
	
	@Test
	public void testCreerCompte() {
		logger.error("testCreerCompte");
		compte1 = new Account();
		compte1.setLabel("label");
		compte1.setNumCompte(new Long(1));
		compte1.setBankBalance(new Double(9999999));
		
		compte1.setPersonne(personneDao.getPersonne(1));

		compteDao.creerCompte(compte1);

		Account compte2 = compteDao.getCompte(new Long(1));

		Assert.assertEquals(compte1.getLabel(), compte2.getLabel());
		Assert.assertEquals(compte1.getNumCompte(), compte2.getNumCompte());
		Assert.assertEquals(compte1.getBankBalance(), compte2.getBankBalance());
	}



	@Test
	public void testSupprimerCompte() {
		logger.error("testSupprimerCompte");
		compteDao.supprimerCompte(compteDao.getCompte(new Long(1)));

		Assert.assertNull(compteDao.getCompte(new Long(1)));
	}
	
	@Test
	public void testSupprimerPersonne() {
		logger.debug("testSupprimerPersonne");
		personneDao.supprimerPersonne(personneDao.getPersonne(1));

		Assert.assertNull(personneDao.getPersonne(1));
	}
	
	@Test
	public void testUpdatePersonne() {
		logger.error("testUpdatePersonne");
		personne1 = new Personne();
		personne1.setLogin("login");
		personne1.setMotDePasse("motDePasse");
		personne1.setNom("nom");
		personne1.setPrenom("prenom");

		personneDao.creerPersonne(personne1);
		personne1 = personneDao.getPersonne(2);
		
		personne1.setLogin("nouveauLogin");
		personneDao.updatePersonne(personne1);

		Assert.assertEquals("nouveauLogin",personneDao.getPersonne(2).getLogin());
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testGetListeComptes() {
		logger.error("testGetListeComptes");
		
		// Creation d'une personne
		Personne dimitri = new Personne();
		dimitri.setLogin("login");
		dimitri.setMotDePasse("motDePasse");
		dimitri.setNom("dimitri");
		dimitri.setPrenom("dimitri");
		personneDao.creerPersonne(dimitri);
		// creation de deux de ses comptes
		compte1 = new Account();
		compte1.setLabel("Dimitri");
		compte1.setNumCompte(new Long(1));
		compte1.setPersonne(dimitri);
		compte1.setBankBalance(new Double(10000));
		
		Account compte2 = new Account();
		compte2.setLabel("Dimitri");
		compte2.setNumCompte(new Long(2));
		compte2.setPersonne(dimitri);
		compte2.setBankBalance(new Double(10000));

		compteDao.creerCompte(compte1);
		compteDao.creerCompte(compte2);
	
		@SuppressWarnings("unused")
		List<Account> listeComptes = personneDao.getListeCompte(dimitri);
		for (Account compte : listeComptes) {
			Assert.assertEquals("Dimitri",compte.getLabel());
		}		
	}
	
	@Test
	public void testCreditAccount(){
		compteDao.creditAccount(new Long(2), -5000);
		Assert.assertEquals(new Double(5000), compteDao.getCompte(new Long(2)).getBankBalance());
	}
}
